package com.lxy.service;

import com.lxy.dto.Exposer;
import com.lxy.dto.SecKillExecution;
import com.lxy.exception.RepeatException;
import com.lxy.exception.SecKillCloseException;
import com.lxy.exception.SecKillException;
import com.lxy.pojo.SecKill;

import java.util.List;

/**
 * 业务接口：站在'使用者'的角度去设计接口
 * 三个方面：方法定义粒度，参数，返回类型（return 类型/异常）
 *
 * @author Manaka
 * @date 2020-03-04 10:32
 */
public interface SecKillService {

    /**
     * 查询所有的秒杀记录
     *
     * @return 所有的秒杀商品
     */
    List<SecKill> getSecKillList();

    /**
     * 查询单个秒杀记录
     *
     * @param secKillId 秒杀ID
     * @return 查询到的秒杀记录
     */
    SecKill getById(long secKillId);

    /**
     * 秒杀开启时，输出秒杀接口地址。否则输出系统时间和秒杀时间
     *
     * @param secKillId 秒杀ID
     * @return 返回DTO中的Exposer
     */
    Exposer exportSecKillUrl(long secKillId);

    /**
     * 执行秒杀操作
     *
     * @param secKillId 秒杀ID
     * @param userPhone 用户手机
     * @param md5       秒杀验证，不一致则秒杀失败
     * @return 秒杀返回结果，封装到SecKillExecution中
     */
    SecKillExecution executeSecKill(long secKillId, long userPhone, String md5) throws SecKillException, RepeatException, SecKillCloseException;


    /**
     * 使用存储过程的秒杀逻辑
     * @param secKillId 秒杀ID
     * @param userPhone 用户手机
     * @param md5       秒杀验证，不一致则秒杀失败
     * @return 秒杀返回结果，封装到SecKillExecution中
     */
    SecKillExecution executeSecKillProducer(long secKillId, long userPhone, String md5);
}
